// PROGRAMA : SISPA001 OPCAO: 'AOS'
// BIBLIOTECA : PRODETR
// SISTEMA : INFORMACOES DE SEGURANCA PUBLICA - SISP
// CLIENTE : SEJUSP - SEC. DA JUSTICA E SEGURANCA PUBLICA
// INSTITUTO DE IDENTIFICACAO, DETRAN E SEFAZ
// PROGRAMADOR : EDU/FM DATA: 09/06/94
// OBJETIVO : CADASTRAR, ATUALIZAR E AUTORIZAR PROGRAMAS PARA
// SER USADO NO SISTEMA.(SIC-OPERACAO)
// ATUALIZACOES DATA
// PROGRAMA : SISPA001 05/01/1998
// BIBLIOTECA : SISP
// PROGRAMADOR : COELHO
// OBJETIVO : ADAPTACAO PARA O SHOPPING DO CIDADAO (P200)
// OBS : ESTE PROGRAMA FOI REESTRUTURADO POR SOLON MIRANDA
// : ALTERACAO DE TELA E DATAS (N6) PARA (N8)
package br.com.vti.sisp_sicrim.antigo.controller.programa;

import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.vti.sisp_sicrim.antigo.controller.tela.Sista001;
import br.com.vti.sisp_sicrim.antigo.controller.tela.Sistha01;
import br.com.vti.sisp_sicrim.antigo.controller.tela.Sistha02;
import br.com.vti.sisp_sicrim.antigo.model.SicOperacao;
import br.com.vti.sisp_sicrim.antigo.model.Sislac01;
import br.com.vti.sisp_sicrim.antigo.util.ExceptionProgram;
import br.com.vti.sisp_sicrim.antigo.util.Sessao;
import br.com.vti.sisp_sicrim.antigo.util.Sisgsisp;
import br.com.vti.sisp_sicrim.antigo.util.UtilBean;

/**
 * Classe : Sispa001 OBJETIVO : CADASTRAR, ATUALIZAR E AUTORIZAR PROGRAMAS PARA SER USADO NO SISTEMA.(SIC-OPERACAO) *
 * 
 * @author Incode - Data: mai/2014
 * 
 */
@Resource
@Path("/antigo/sispa001")
public class Sispa001 {
	// Views utilizadas
	SicOperacao vwDveope = new SicOperacao();
	// Telas/relatorios utilizados
	Sista001 sista001;
	Sistha01 sistha01;
	Sistha02 sistha02;
	// Includes utilizados
	Sislac01 sislac01 = new Sislac01();
	// Areas globais / session
	Sisgsisp sisgsisp;
	// Funcoes/subrotinas
	FuncoesGerais funcoes = new FuncoesGerais();

	Result result;
	Sessao sessao;
	Boolean primeiraVez = false;
	Sispa001 sispa001Anterior;
	String faseproc = "0";

	private int i = 0;
	private int data = 0;
	private int j = 0;
	private int w = 0;
	private String mdfuop = "";
	private String[] tbo = { "", "VEI", "CON", "MUL", "ARR", "IPV", "ROU", "PMM", "VIS", "TAB", "SEN", "CRI", "IDC", "REN", "FUN", "BAT", "RCH", "RFR", "RPM", "SUP", "CCM", "PRF" };

	private Sista001 preMapas() {
		sista001 = new Sista001(true, sessao);
		sistha01 = new Sistha01(true, sessao);
		sistha02 = new Sistha02(true, sessao);

		sista001.setNavegar("../sispa001/executar");
		sistha01.setNavegar("../sispa001/executar");
		sistha02.setNavegar("../sispa001/executar");
		// Arrays.fill(tbo, "");
		sista001.setNomeClasse(this.getClass().getSimpleName().toUpperCase());
		sista001.setDataCorrente(UtilBean.obtemDataCorrente());
		sista001.setDataCorrente(UtilBean.inverteDataCorrente());
		sista001.setDatatu(sista001.getDataCorrente());
		sista001.setDinopematfun(sessao.getSisgsisp().getMatric());
		data = UtilBean.obtemDataCorrente();
		// Par�grafo: r0()
		return sista001;
	}

	public Sispa001(Result result, Sessao sessao) {
		this.result = result;
		this.sessao = sessao;
	}

	@Post
	public void executar(Sista001 sista001, Sistha01 sistha01, Sistha02 sistha02) {
		try {
			main(sista001, sistha01, sistha02);
		} catch (Exception e) {
			ExceptionProgram excp = new ExceptionProgram();
			excp.trataErroSiscerro(e, sessao, this.getClass().getSimpleName());
		}
	}

	private void main(Sista001 psista001, Sistha01 psistha01, Sistha02 psistha02) throws Exception {
		int modulo = 0;
		if (psista001 == null && psistha01 == null && psistha02 == null) {
			primeiraVez = true;
			// sista001 = new Sista001 (primeiraVez);
			sista001 = preMapas();
			sista001.setNavegar("../sispa001/executar");
			result.include("sista001", sista001);
			sessao.setAtributo("SISPA001", this);
			sista001.enviarTela(primeiraVez, result, getClass().getSimpleName().toUpperCase());
			return;
		} else {
			restaurarEstados(psista001, psistha01, psistha02);
		}

		if (faseproc.equals("0")) {
			sista001.setSn("N");
			// tela = "";
			mdfuop = "";
			j = 0;

			sista001.receberTela(false, result);
			if (!sista001.getOperacao().equals("AOS")) {
				chamaPrograma();
			}

			for (i = 1; i <= 21; i++) {
				if (tbo[i] != null && tbo[i].equals(sista001.getMdd())) {
					modulo = i + 1;
					break;
				}
			}
			mdfuop = UtilBean.moveSubstring(mdfuop, 0, 2, "N", modulo);
			// MODULO := I + 3
			vwDveope.consultaMdfuop(sista001.getWfinal(), sista001.getOpera(), modulo);

			if (vwDveope.registrosProcessados() == 0) {
				sista001.setMensagemSaida("REGISTRO INEXISTENTE - TECLE PF5 P/INCLUIR");
			} else {
				sista001.setMensagemSaida("REGISTRO EXISTENTE - TECLE PF5 P/ATUALIZAR");
				sista001.setDatatu(vwDveope.getDataAtu());
				sista001.setDatatu((int) funcoes.sissd002(sista001.getDatatu()));
				sista001.setMdd(tbo[vwDveope.getModulo() - 1]);
				sista001.setOpera(vwDveope.getOperacao());
				// MDD := TBO(DINOPE-MODULO - 3)
				sista001.setProgr(vwDveope.getPrograma());
				sista001.setDescr(vwDveope.getDescricao());
				sista001.setWfinal(vwDveope.getFuncao());
				for (i = 1; i <= 7; i++) {
					for (w = 1; w <= 3; w++) {
						j += 1;
						if (vwDveope.getModdis(j) != null) {
							if (vwDveope.getModdis(j).intValue() > 0) {
								sista001.setModul(w, i, "S");
							} else {
								sista001.setModul(w, i, "N");
							}
						} else {
							sista001.setModul(w, i, "N");
						}
					}
				}
			}

			// sista001.setSnOVE(AD=P)("S") ;

			faseproc = "1";
			result.include("sista001", sista001);
			sessao.setAtributo("SISPA001", this);
			sista001.enviarTela(false, result, getClass().getSimpleName().toUpperCase());
			return;
		}
		if (faseproc.equals("1")) {
			sista001.receberTela(false, result);
			if (!sista001.getOperacao().equals("AOS")) {
				chamaPrograma();
			}
			if (UtilBean.funcao.equals(UtilBean.ctt_retorna)) {
				preMapas();
				result.include("sista001", sista001);
				sessao.setAtributo("SISPA001", this);
				sista001.enviarTela(false, result, getClass().getSimpleName().toUpperCase());
				return;
			}
			/*
			 * if (!UtilBean.funcao.equals(UtilBean.ctt_confirma)) { sista001.enviarMensagem(null, "TECLE PF5 PARA ATUALIZAR"); result.include("sista001", sista001); sessao.setAtributo("SISPA001",
			 * this); sista001.enviarTela(false, result, getClass().getSimpleName().toUpperCase()); return; }
			 */
			for (i = 1; i <= 21; i++) {
				if (tbo[i] != null && tbo[i].equals(sista001.getMdd())) {
					modulo = i + 1;
					break;
				}
			}
			mdfuop = UtilBean.moveSubstring(mdfuop, 0, 2, "N", modulo);
			vwDveope.consultaMdfuop(sista001.getWfinal(), sista001.getOpera(), modulo);

			if (vwDveope.registrosProcessados() == 0) {
				faseproc = "3";
				sistha02.setNavegar("../sispa001/executar");
				result.include("sistha02", sistha02);
				sessao.setAtributo("SISPA001", this);
				sistha02.enviarTela(false, result, getClass().getSimpleName().toUpperCase());
			} else {
				faseproc = "2";
				sistha01.setNavegar("../sispa001/executar");
				result.include("sistha01", sistha01);
				sessao.setAtributo("SISPA001", this);
				sistha01.enviarTela(false, result, getClass().getSimpleName().toUpperCase());
			}
			return;
		}
		if (faseproc.equals("2")) {
			sistha01.receberTela(false, result);
			if (UtilBean.funcao.equals(UtilBean.ctt_retorna)) {
				sistha01.setNavegar("../sispa001/executar");
				sista001.setMensagemSaida("ALTERACAO NAO FOI EXECUTADA");
				result.include("sista001", sista001);
				sessao.setAtributo("SISPA001", this);
				sista001.enviarTela(false, result, getClass().getSimpleName().toUpperCase());
				return;
			}
			funcoes.tabsatu(sessao);
			if (!funcoes.camret.equals("")) {
				sistha02.setNavegar("../sispa001/executar");
				sistha02.enviarMensagem(funcoes.camret, "");
				sessao.setAtributo("SISPA001", this);
				result.include("sistha02", sistha02);
				sistha02.enviarTela(primeiraVez, result, getClass().getSimpleName().toUpperCase());
				return;
			}
			// INCLUDE IDCCC002
			for (i = 1; i <= 21; i++) {
				if (tbo[i] != null && tbo[i].equals(sista001.getMdd())) {
					modulo = i + 1;
					break;
				}
			}
			mdfuop = UtilBean.moveSubstring(mdfuop, 0, 2, "N", modulo);
			vwDveope.consultaMdfuop(sista001.getWfinal(), sista001.getOpera(), modulo);
			if (!sistha01.getOp3().trim().equals("")) {// exclui
				vwDveope.exclui();
				// dao.commit();
				faseproc = "0";
				preMapas();
				sista001.setMensagemSaida("REGISTRO DELETADO OK.");

				result.include("sista001", sista001);
				sessao.setAtributo("SISPA001", this);
				sista001.enviarTela(false, result, getClass().getSimpleName().toUpperCase());
				return;
			}
			if (!sistha01.getOp2().trim().equals("")) {// atualiza
				vwDveope.setModulo(Integer.parseInt(UtilBean.subStr(mdfuop, 0, 2)));
				vwDveope.setDataAtu(UtilBean.obtemDataCorrente());
				vwDveope.setMatriculaFunc(sessao.getSisgsisp().getMatric());
				vwDveope.setOperacao(sista001.getOpera());
				vwDveope.setFuncao(sista001.getWfinal());
				vwDveope.setPrograma(sista001.getProgr());
				vwDveope.setDescricao(sista001.getDescr());
				modulo = 1;
				mdfuop = UtilBean.moveSubstring(mdfuop, 0, 2, "N", modulo);
				j = 0;
				for (int i1 = 1; i1 <= 30; i1++) {
					vwDveope.setModdis(i1, 0);
				}
				for (i = 1; i <= 7; i++) {
					for (w = 1; w <= 3; w++) {
						modulo += 1;
						mdfuop = UtilBean.moveSubstring(mdfuop, 0, 2, "N", modulo);
						j += 1;
						if (sista001.getModul(w, i).equals("S")) {
							vwDveope.setModdis(j, Integer.parseInt(UtilBean.subStr(mdfuop, 0, 2)));
						} else {
							vwDveope.setModdis(j, 0);
						}
					}
				}

				vwDveope.atualiza();

				preMapas();

				faseproc = "0";
				sista001.setMensagemSaida("REGISTRO ALTERADO OK.");
				result.include("sista001", sista001);
				sessao.setAtributo("SISPA001", this);
				sista001.enviarTela(false, result, getClass().getSimpleName().toUpperCase());
				return;
			}
			sista001.setMensagemSaida("REGISTRO ALTERADO OK.");
			result.include("sista001", sista001);
			sessao.setAtributo("SISPA001", this);
			sista001.enviarTela(false, result, getClass().getSimpleName().toUpperCase());
			return;
		}
		if (faseproc.equals("3")) {
			sistha02.receberTela(false, result);
			if (UtilBean.funcao.equals(UtilBean.ctt_retorna)) {
				sista001.setMensagemSaida("ALTERACAO NAO FOI EXECUTADA");
				result.include("sista001", sista001);
				sessao.setAtributo("SISPA001", this);
				sista001.enviarTela(false, result, getClass().getSimpleName().toUpperCase());
				return;
			}
			funcoes.tabsatu(sessao);
			if (!funcoes.camret.equals("")) {

				faseproc = "3";
				sistha02.enviarMensagem("", "N�O TEM PERMISS�O");
				sessao.setAtributo("SISPA001", this);
				result.include("sistha02", sistha02);
				sistha02.enviarTela(primeiraVez, result, getClass().getSimpleName().toUpperCase());
				return;
			}
			// INCLUDE IDCCC002
			vwDveope.setOperacao(sista001.getOpera());
			vwDveope.setPrograma(sista001.getProgr());
			vwDveope.setDescricao(sista001.getDescr());
			vwDveope.setFuncao(sista001.getWfinal());
			vwDveope.setDataAtu(UtilBean.obtemDataCorrente());
			vwDveope.setMatriculaFunc(sessao.getSisgsisp().getMatric());
			for (i = 1; i <= 21; i++) {
				if (tbo[i] != null && tbo[i].equals(sista001.getMdd())) {
					vwDveope.setModulo(i + 1);
					break;
				}
			}
			// VW-DVEOPE.DINOPE-MODULO := I + 3
			for (int i1 = 1; i1 <= 30; i1++) {
				vwDveope.setModdis(i1, 0);
			}
			modulo = 1;
			mdfuop = UtilBean.moveSubstring(mdfuop, 0, 2, "N", modulo);
			j = 0;
			for (i = 1; i <= 7; i++) {
				for (w = 1; w <= 3; w++) {
					modulo += 1;
					mdfuop = UtilBean.moveSubstring(mdfuop, 0, 2, "N", modulo);
					j += 1;
					if (sista001.getModul(w, i).equals("S")) {
						vwDveope.setModdis(j, Integer.valueOf(UtilBean.subStr(mdfuop, 0, 2)));
					} else {
						vwDveope.setModdis(j, 0);
					}
				}
			}

			vwDveope.grava();

			// dao.commit();
			preMapas();
			sista001.setMensagemSaida(UtilBean.concatena("REGISTRO INCLUIDO OK ", sista001.getOpera()));
			faseproc = "0";
			result.include("sista001", sista001);
			sessao.setAtributo("SISPA001", this);
			sista001.enviarTela(false, result, getClass().getSimpleName().toUpperCase());
			return;
		}
		sessao.setAtributo("SISPA001", this);
		result.include("sista001", sista001);
		sista001.enviarTela(primeiraVez, result, getClass().getSimpleName().toUpperCase());
	}

	private void chamaPrograma() {
		funcoes.sissm001(result, sessao);
	}

	private void restaurarEstados(Sista001 psista001, Sistha01 psistha01, Sistha02 psistha02) {
		this.sispa001Anterior = (Sispa001) sessao.getAtributo("SISPA001");
		if (psista001 != null) {
			sista001 = psista001;
		} else {
			sista001 = this.sispa001Anterior.sista001;
		}
		sista001.setSessao(sessao);
		if (psistha01 != null) {
			sistha01 = psistha01;
		} else {
			sistha01 = this.sispa001Anterior.sistha01;
		}
		sistha01.setSessao(sessao);
		if (psistha02 != null) {
			sistha02 = psistha02;
		} else {
			sistha02 = this.sispa001Anterior.sistha02;
		}
		sistha02.setSessao(sessao);
		this.faseproc = this.sispa001Anterior.faseproc;
	}
}
